package filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class LoginFilter implements Filter{
	
	private FilterConfig config;

	@Override
	public void destroy() {
		System.out.println("start...run...LoginFilter...destroy");
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		// 得到用户请求的URI
		String request_uri = ((HttpServletRequest) request).getRequestURI();
		//防止过滤器把 js和 css等文件拦截了
		if (request_uri.contains(".css") || request_uri.toString().contains(".js") || request_uri.toString().contains(".png") || request_uri.toString().contains(".jpg") || request_uri.toString().contains(".woff2")  || request_uri.toString().contains(".map")) {
		//发现是css或者js文件，直接放行
		chain.doFilter(request, response);
		return;
		}

		
		//过滤器截取到页面请求后做的操作。
//		System.out.println("start...run...LoginFilter...doFilter");	
		
		//强制转换request的类型为HttpServletRequest（不同的类有不同的方法）
		HttpServletRequest requ = (HttpServletRequest) request;
		
		//强制转换response的类型为HttpServletResponse
		HttpServletResponse respon = (HttpServletResponse) response;
		
		//通过requ获取session
		HttpSession session = requ.getSession();
		
		//获取的是web.xml中filter过滤器配置中的init-param标签下的初始化信息
		String noLoginPaths = config.getInitParameter("noLoginPaths");
		
		//打印结果：login;404.jsp，同上面解释对应
//		System.out.println(noLoginPaths);
		
//		System.out.println(requ.getRequestURI());
		
		//不为空则执行，即如果设置了不经过过滤器的页面，则在方法下面做具体的操作
		if(noLoginPaths!=null) {
			
			//按照“；”将页面信息分割开来保存进数组
			String[] strArr = noLoginPaths.split(";");
			
			for (String string : strArr) {		
				if(string == null || "".equals(string))continue;	
				//页面请求带过来的信息
				//即如果要访问的页面是noLoginPaths配置中的一个，则无需过滤器过滤，直接通过。
				if(requ.getRequestURI().indexOf(string)!=-1) {			
					chain.doFilter(request, response);			
					return;
				}			
			}		
		}	
		/***
		 * 判断session域中是否有username的信息，
		 * 如果有说明用户已经登录过，可以进入success页面，
		 * 如果没有则跳转到登陆页面让用户登录
		 */
		if(session.getAttribute("uid")!=null) {			
			chain.doFilter(request, response);			
		}else {			
			respon.sendRedirect(requ.getContextPath()+"/login");			
		}		
		//过滤器收到服务器返回的请求之后所作的操作。
		System.out.println("end...run...LoginFilter...doFilter");
	}

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {	
//		System.out.println("start...run...LoginFilter...init");	
		//在web.xml初始化时将filterConfig赋值给自定义的config，以便后期获取web.xml中的filter初始配置信息。
		config = filterConfig;		
		//打印结果：ApplicationFilterConfig[name=LoginFilter, filterClass=com.minGe.Filter.LoginFilter]
		//System.out.println(config);
	}
}
